package com.my.ds.impl.array;

import java.util.Arrays;
import java.util.Objects;

/**
 * 动态数组实现
 *
 * @author: marshal
 * @date: 2023-02-16 15:26
 */
public class MyArrayList {
    /**
     * 默认容量
     */
    private static final int DEFAULT_CAPACITY = 10;
    private static final int[] EMPTY_ELEMENTDATA = {};

    /**
     * 存储元素的数组
     */
    private int[] elementData;

    /**
     * 元素的数量
     */
    private int size;

    public MyArrayList(int capacity) {
        if (capacity > 0) {
            this.elementData = new int[capacity];
        } else if (capacity == 0) {
            this.elementData = EMPTY_ELEMENTDATA;
        } else {
            throw new IllegalArgumentException("Illegal Capacity: " + capacity);
        }
    }

    public MyArrayList() {
        // 初始化的时候，如果不传入参数，直接将elementData赋值为空数组
        this.elementData = EMPTY_ELEMENTDATA;
    }


    public int size() {
        return size;
    }

    public boolean isEmpty() {
        return size == 0;
    }

    /**
     * 每次增加5
     *
     * @return elementData
     */
    private int[] grow() {
        if (elementData.length > 0) {
            elementData = Arrays.copyOf(elementData, elementData.length + 5);
        } else {
            elementData = new int[DEFAULT_CAPACITY];
        }
        return elementData;
    }

    /**
     * 添加元素
     *
     * @param e           元素
     * @param elementData 元素数组
     * @param s           元素数量
     */
    private void add(int e, int[] elementData, int s) {
        if (s == elementData.length) {
            elementData = grow();
        }
        elementData[s] = e;
        size = s + 1;
    }


    public boolean add(int e) {
        add(e, elementData, size);
        return true;
    }

    public int get(int index) {
        Objects.checkIndex(index, size);
        return elementData[index];
    }

    /**
     * 删除元素
     *
     * @param index 根据下标删除元素
     * @return 删除的元素
     */
    public int remove(int index) {
        Objects.checkIndex(index, size);
        final int[] es = elementData;
        int oldValue = es[index];
        fastRemove(es, index);
        return oldValue;
    }

    /**
     * 删除指定下标处的元素，同时将元素左移，将后面空出来的位置上的元素设为0
     *
     * @param es 元素数组
     * @param i  删除元素的下标
     */
    private void fastRemove(int[] es, int i) {
        final int newSize;
        // 因为只移除一个元素，所以 newSize = size - 1
        if ((newSize = size - 1) > i) {
            // 从下标 i + 1 开始，所有元素向前移动一位
            System.arraycopy(es, i + 1, es, i, newSize - i);
        }
        // 最后一位元素设置为 0
        es[size = newSize] = 0;
    }
}
